package modelo;

import java.util.ArrayList;

import creadores.FabricaBonus;
import creadores.FabricaEnemigos;

import modelo.TanqueAlgo;
import modelo.Escenario;
import titiritero.Dibujable;
import utilitarios.PuntoXY;


public abstract class Nivel {
    
    protected static int FLOTA_MINIMA = 4;
	
    protected int cantidadBonusAlanzar;
	protected int cantidadEnemigos;
	protected FabricaBonus fabricaBonus;
	protected FabricaEnemigos fabricaEnemigos;
	protected Escenario escenario = new Escenario(500, 500);
	protected TanqueAlgo jugador = new TanqueAlgo(escenario, new PuntoXY(250, 455));
	
	public Nivel() {
	}
	
	public void setJugador(TanqueAlgo unJugador) {
	    this.jugador = unJugador;
	}
	
	public void setEscenario(Escenario unEscenario) {
	    this.escenario = unEscenario;
	}

	public TanqueAlgo getJugador() {
	    return this.jugador;
	}
	
	public void cargarNivel() {
	    jugador.setPosicion(new PuntoXY(250, 455));
	    this.escenario.agregarJugador(this.jugador);
	    this.fabricaBonus = new FabricaBonus(cantidadBonusAlanzar, escenario);
	    this.fabricaEnemigos = new FabricaEnemigos(escenario, this);
	    
	    try {
	        ArrayList<Objeto> objetos = crearObjetos();
	        for (Objeto o : objetos) {
                escenario.agregarObjeto(o);
            }
        } catch (Exception er) {
            er.printStackTrace();
        }

	}
	
	public abstract ArrayList<Objeto> crearObjetos();

    /**
	 * Devuelve una lista con los objetos dibujables del escenario
	 * @return ArrayList<Dibujable>
	 */	
	public ArrayList<Dibujable> crearVistasDeObjetos() {
		
		ArrayList<Dibujable> listaDibujables = new ArrayList<Dibujable>();
		listaDibujables.add(this.escenario.crearDibujable());
		
		for (Objeto o : this.escenario.getObjetos()) {
			Dibujable dibujable = o.crearDibujable();
			listaDibujables.add(dibujable);
			
		}
		
		return listaDibujables;
	}
	
	public void vivir() {
	    this.fabricaBonus.vivir();
	    this.fabricaEnemigos.vivir();
		this.escenario.vivir();		
	}	

	public Escenario getEscenario() {
		return this.escenario;
	}

    public boolean fueGanado() {
        boolean condicion1 = this.cantidadEnemigos == this.escenario.getAlgoTank().getTanquesDestruidos();
        boolean condicion2 = this.escenario.getAlgoTank().getPuntos() >= 1000;
    	return (condicion1 || condicion2);
    }

    public int getCantidadEnemigos() {
        return this.cantidadEnemigos;
    }

}
